$PBExportHeader$uo_tp_sql.sru
forward
global type uo_tp_sql from uo_tp_dw
end type
end forward

global type uo_tp_sql from uo_tp_dw
event ue_creasqlinsert ( )
end type
global uo_tp_sql uo_tp_sql

type variables
string		is_sqlprev[]

end variables

forward prototypes
public function integer uof_getsqlprev (ref string as_sqlprev[])
public function string uof_get_editmask ()
end prototypes

event ue_creasqlinsert;int				li_ret
string			ls_reset[]
int				ll_loopcol,	ll_looprow
dwitemstatus	ldwitemstatus
Integer iAux
String sAux, argumentos

for ll_looprow = 1 to dw_1.rowcount()
/*
	for ll_loopcol = 1 to long(dw_1.Object.DataWindow.Column.Count)
//		li_ret = dw_1.setitemstatus( ll_looprow, ll_loopcol, Primary!, New!)
//		ldwitemstatus = dw_1.getitemstatus( ll_looprow, ll_loopcol, Primary!)
		li_ret = dw_1.setitemstatus( ll_looprow, ll_loopcol, Primary!, NewModified!)
		ldwitemstatus = dw_1.getitemstatus( ll_looprow, ll_loopcol, Primary!)
	next
*/		
	li_ret = dw_1.setitemstatus( ll_looprow, 0, Primary!, NewModified!)
next

is_sqlprev[] = ls_reset[]

// Evita el sql delete 
dw_1.RowsDiscard(1, dw_1.DeletedCount(), Delete!)

dw_1.update()

/* Reemplaza el INSERT de la primer tabla por el execute de un procedure */
FOR iAux = 1 TO UpperBound(dw_1.at_col[])
	If iAux <> 1 Then argumentos = argumentos + ', '
	CHOOSE CASE dw_1.at_col[iAux].Tipo
		CASE 'char('
			// modificacion para el caso de que el argumento string tenga apostrofe
			IF Pos(dw_1.GetItemString(1, iAux), "'") > 0 THEN
				sAux = + '"' + dw_1.GetItemString(1, iAux) + '"'
			ELSE		
				sAux = + "'" + dw_1.GetItemString(1, iAux) + "'"
			END IF
			
		CASE 'long', 'numbe', 'real'
			sAux = String(dw_1.GetItemNumber(1, iAux))
		CASE 'decim'
			sAux = String(dw_1.GetItemDecimal(1, iAux))
//		CASE 'date'
//			sAux = f_date_a_string(dw_1.GetItemDate(1, iAux))
//		CASE 'datet'
//			sAux = f_datetime_a_string(dw_1.GetItemDateTime(1, iAux))
//		CASE 'time'
//			sAux = String(dw_1.GetItemTime(1, iAux))
	END CHOOSE
	If isNull(sAux) Then sAux = 'null'
	argumentos = argumentos + sAux
NEXT

is_sqlprev[1] = 'Execute procedure ' + dw_1.Object.DataWindow.Table.UpdateTable + '( ' + argumentos + ' );'

end event

public function integer uof_getsqlprev (ref string as_sqlprev[]);as_sqlprev[] = is_sqlprev[]
return 1
end function

public function string uof_get_editmask ();/* 
	Descripcion: 	Recupera la mascara de la columna clave de la dw, si existe

	Retorna: 		String
						- la mascara de edicion de la columna clave de la dw, si la clave existe y si tiene mascara
						- "" (mascara inexistente), si la dw no tiene clave o si no tiene mascara
						
	NOTA : La funcion toma la mascara de la primera columna clave que se encuentra
*/

long 		ll_i,	ll_cant_col
string 	ls_mascara
boolean	lb_clave

lb_clave = FALSE
ll_i = 1

// Cantidad de columnas de la dw
ll_cant_col = Long(dw_1.Object.DataWindow.Column.Count)

// Determinar la columna clave con mascara de la dw - primer columna clave encontrada (tenga o no mascara)
DO WHILE (ll_i <= ll_cant_col) AND NOT (lb_clave)
	IF String(dw_1.Describe("#" + String(ll_i) + ".Key")) = "yes" THEN
		lb_clave = TRUE
	ELSE	
		ll_i ++
	END IF
LOOP
	
IF lb_clave THEN 
	ls_mascara = String(dw_1.Describe("#" + String(ll_i) + ".editmask.mask"))
ELSE
	// Mascara INEXISTENTE
	ls_mascara = "?"
END IF
	
// Retorno de la funcion
IF ls_mascara <> "?" THEN
	RETURN ls_mascara
ELSE
	RETURN ""
END if
end function

on uo_tp_sql.create
call super::create
end on

on uo_tp_sql.destroy
call super::destroy
end on

event ue_iniciar;call super::ue_iniciar;string		ls_reset[]

is_sqlprev[] = ls_reset[]

// Extension del evento ancestro_: en este caso se habilitan para edicion las columnas de la clave, si la accion es 'A'
// - catalogacion de un nuevo objeto - para catalogacion se asume que se puede editar la clave
IF arg_accion = 'A' THEN
	IF NOT IsNull(dw_1.ii_claves[]) THEN
		IF UpperBound(dw_1.ii_claves[]) > 0 THEN
			// Existe clave, poner foco en primera columna de la clave
			dw_1.SetColumn(dw_1.ii_claves[1])
		ELSE
			//poner foco en primera columna de la dw
			dw_1.SetColumn(1)
		END IF
	ELSE
		//poner foco en primera columna de la dw
		dw_1.SetColumn(1)
	END IF
// Modificacion: en ancestro, pone el foco en primera columna editable (deshabilita la clave)
END IF

end event

event dw_1::sqlpreview;if request = PreviewFunctionUpdate! then
	choose case sqltype
		case PreviewUpdate! , PreviewInsert!, PreviewDelete!
			is_sqlprev[upperbound(is_sqlprev[])+1] = sqlsyntax + ';'
			return 2
	end choose
end if

end event

event dw_1::losefocus;IF (THIS.GetItemstatus(THIS.GetRow(), 0, Primary!) <> New!) AND &
	(THIS.GetItemstatus(THIS.GetRow(), 0, Primary!) <> NewModified!) THEN
	IF NOT IsNull(THIS.ii_claves[]) THEN
		IF UpperBound(THIS.ii_claves[]) < Integer(THIS.Describe("Datawindow.Column.Count")) THEN
			THIS.SetColumn(UpperBound(THIS.ii_claves[]) + 1) 
		END IF
	END IF
END IF
end event

